#ifndef MAP_H
#define MAP_H

#include "strcut.h"

/**
 * @brief 初始化地图并布置地雷
 *
 * 该函数负责整个地图的初始化流程，包括：
 * 1. 设置随机数种子（确保每次游戏地雷位置不同）
 * 2. 分配地图内存空间
 * 3. 随机放置指定数量的地雷
 * 4. 计算每个非地雷格子周围的地雷数量
 *
 * @param rows 地图行数（必须为正整数）
 * @param cols 地图列数（必须为正整数）
 * @param num_mines 地雷数量（必须小于rows*cols）
 */
void init_map(int rows, int cols, int num_mines);
/**
 * @brief 打印当前地图状态
 *
 * 该函数以可读格式输出地图的当前状态，包括：
 * - 行列坐标标记
 * - 地雷位置（*表示）
 * - 已揭开的格子（显示数字或空格）
 * - 被标记的格子（F表示）
 * - 未揭开的格子（.表示）
 *
 * @param rows 地图行数
 * @param cols 地图列数
 * @param reveal_all
 * 控制是否显示全部信息（1=显示地雷和数字，0=仅显示已揭开/标记的格子）
 *                  用于调试或游戏结束时的全局展示
 */
void print_map(int rows, int cols, int reveal_all);
/**
 * @brief 揭开指定位置的格子
 *
 * 该函数处理玩家点击格子时的核心逻辑，包括：
 * 1. 检查坐标是否有效
 * 2. 检查格子是否已被标记或已揭开
 * 3. 如果点击的是地雷，游戏结束
 * 4. 如果是安全格子，调用reveal_empty递归揭开空白区域
 *
 * @param x 目标格子的行坐标（0-based）
 * @param y 目标格子的列坐标（0-based）
 * @param rows 地图总行数（用于边界检查）
 * @param cols 地图总列数（用于边界检查）
 */
void reveal_cell(int x, int y, int rows, int cols);
/**
 * @brief 切换指定格子的标记状态（旗帜/无旗帜）
 *
 * 该函数用于玩家标记或取消标记可能的地雷位置，核心逻辑包括：
 * 1. 检查目标格子是否已被揭开（已揭开的格子不可标记）
 * 2. 反转格子的 `is_flagged` 状态（1 ↔ 0）
 *
 * @param x 目标格子的行坐标（0-based）
 * @param y 目标格子的列坐标（0-based）
 */
void toggle_flag(int x, int y);

extern cell** map;

#endif